/****************************************************************************
**
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the Qt Solutions component.
**
** $QT_BEGIN_LICENSE:BSD$
** You may use this file under the terms of the BSD license as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
**   * Redistributions of source code must retain the above copyright
**     notice, this list of conditions and the following disclaimer.
**   * Redistributions in binary form must reproduce the above copyright
**     notice, this list of conditions and the following disclaimer in
**     the documentation and/or other materials provided with the
**     distribution.
**   * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
**     of its contributors may be used to endorse or promote products derived
**     from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/

#ifndef QTPROPERTYMANAGER_H
#define QTPROPERTYMANAGER_H

#include "qtpropertybrowser.h"
#include <QLineEdit>

#if QT_VERSION >= 0x040400
QT_BEGIN_NAMESPACE
#endif

class QDate;
class QTime;
class QDateTime;
class QLocale;

class QT_QTPROPERTYBROWSER_EXPORT QtFilePathPropertyManager
    : public QtAbstractPropertyManager {
  Q_OBJECT
public:
  QtFilePathPropertyManager(QObject *parent = 0)
      : QtAbstractPropertyManager(parent) {}

  QString value(const QtProperty *property) const;
  QString filter(const QtProperty *property) const;
  QString mode(const QtProperty *property) const;

public slots:
  void setValue(QtProperty *property, const QString &val);
  void setFilter(QtProperty *property, const QString &fil);
  void setMode(QtProperty *property, const QString &mode);
signals:
  void valueChanged(QtProperty *property, const QString &val);
  void filterChanged(QtProperty *property, const QString &fil);
  void modeChanged(QtProperty *property, const QString &mode);

protected:
  virtual QString valueText(const QtProperty *property) const {
    return value(property);
  }
  virtual void initializeProperty(QtProperty *property) {
    theValues[property] = Data();
  }
  virtual void uninitializeProperty(QtProperty *property) {
    theValues.remove(property);
  }

private:
  struct Data {
    QString value;
    QString filter;
    QString mode;
  };

  QMap<const QtProperty *, Data> theValues;
};

class QT_QTPROPERTYBROWSER_EXPORT QtGroupPropertyManager
    : public QtAbstractPropertyManager {
  Q_OBJECT
public:
  QtGroupPropertyManager(QObject *parent = 0);
  ~QtGroupPropertyManager();

protected:
  virtual bool hasValue(const QtProperty *property) const;

  virtual void initializeProperty(QtProperty *property);
  virtual void uninitializeProperty(QtProperty *property);
};

class QtIntPropertyManagerPrivate;

class QT_QTPROPERTYBROWSER_EXPORT QtIntPropertyManager
    : public QtAbstractPropertyManager {
  Q_OBJECT
public:
  QtIntPropertyManager(QObject *parent = 0);
  ~QtIntPropertyManager();

  int value(const QtProperty *property) const;
  int minimum(const QtProperty *property) const;
  int maximum(const QtProperty *property) const;
  int singleStep(const QtProperty *property) const;
  bool isReadOnly(const QtProperty *property) const;

public Q_SLOTS:
  void setValue(QtProperty *property, int val);
  void setMinimum(QtProperty *property, int minVal);
  void setMaximum(QtProperty *property, int maxVal);
  void setRange(QtProperty *property, int minVal, int maxVal);
  void setSingleStep(QtProperty *property, int step);
  void setReadOnly(QtProperty *property, bool readOnly);
Q_SIGNALS:
  void valueChanged(QtProperty *property, int val);
  void rangeChanged(QtProperty *property, int minVal, int maxVal);
  void singleStepChanged(QtProperty *property, int step);
  void readOnlyChanged(QtProperty *property, bool readOnly);

protected:
  QString valueText(const QtProperty *property) const;
  virtual void initializeProperty(QtProperty *property);
  virtual void uninitializeProperty(QtProperty *property);

private:
  QtIntPropertyManagerPrivate *d_ptr;
  Q_DECLARE_PRIVATE(QtIntPropertyManager)
  Q_DISABLE_COPY(QtIntPropertyManager)
};

class QtBoolPropertyManagerPrivate;

class QT_QTPROPERTYBROWSER_EXPORT QtBoolPropertyManager
    : public QtAbstractPropertyManager {
  Q_OBJECT
public:
  QtBoolPropertyManager(QObject *parent = 0);
  ~QtBoolPropertyManager();

  bool value(const QtProperty *property) const;
  bool textVisible(const QtProperty *property) const;

public Q_SLOTS:
  void setValue(QtProperty *property, bool val);
  void setTextVisible(QtProperty *property, bool textVisible);
Q_SIGNALS:
  void valueChanged(QtProperty *property, bool val);
  void textVisibleChanged(QtProperty *property, bool);

protected:
  QString valueText(const QtProperty *property) const;
  QIcon valueIcon(const QtProperty *property) const;
  virtual void initializeProperty(QtProperty *property);
  virtual void uninitializeProperty(QtProperty *property);

private:
  QtBoolPropertyManagerPrivate *d_ptr;
  Q_DECLARE_PRIVATE(QtBoolPropertyManager)
  Q_DISABLE_COPY(QtBoolPropertyManager)
};

class QtDoublePropertyManagerPrivate;

class QT_QTPROPERTYBROWSER_EXPORT QtDoublePropertyManager
    : public QtAbstractPropertyManager {
  Q_OBJECT
public:
  QtDoublePropertyManager(QObject *parent = 0);
  ~QtDoublePropertyManager();

  double value(const QtProperty *property) const;
  double minimum(const QtProperty *property) const;
  double maximum(const QtProperty *property) const;
  double singleStep(const QtProperty *property) const;
  int decimals(const QtProperty *property) const;
  bool isReadOnly(const QtProperty *property) const;

public Q_SLOTS:
  void setValue(QtProperty *property, double val);
  void setMinimum(QtProperty *property, double minVal);
  void setMaximum(QtProperty *property, double maxVal);
  void setRange(QtProperty *property, double minVal, double maxVal);
  void setSingleStep(QtProperty *property, double step);
  void setDecimals(QtProperty *property, int prec);
  void setReadOnly(QtProperty *property, bool readOnly);
Q_SIGNALS:
  void valueChanged(QtProperty *property, double val);
  void rangeChanged(QtProperty *property, double minVal, double maxVal);
  void singleStepChanged(QtProperty *property, double step);
  void decimalsChanged(QtProperty *property, int prec);
  void readOnlyChanged(QtProperty *property, bool readOnly);

protected:
  QString valueText(const QtProperty *property) const;
  virtual void initializeProperty(QtProperty *property);
  virtual void uninitializeProperty(QtProperty *property);

private:
  QtDoublePropertyManagerPrivate *d_ptr;
  Q_DECLARE_PRIVATE(QtDoublePropertyManager)
  Q_DISABLE_COPY(QtDoublePropertyManager)
};

class QtStringPropertyManagerPrivate;

class QT_QTPROPERTYBROWSER_EXPORT QtStringPropertyManager
    : public QtAbstractPropertyManager {
  Q_OBJECT
public:
  QtStringPropertyManager(QObject *parent = 0);
  ~QtStringPropertyManager();

  QString value(const QtProperty *property) const;
  QRegExp regExp(const QtProperty *property) const;
  EchoMode echoMode(const QtProperty *property) const;
  bool isReadOnly(const QtProperty *property) const;

public Q_SLOTS:
  void setValue(QtProperty *property, const QString &val);
  void setRegExp(QtProperty *property, const QRegExp &regExp);
  void setEchoMode(QtProperty *property, EchoMode echoMode);
  void setReadOnly(QtProperty *property, bool readOnly);

Q_SIGNALS:
  void valueChanged(QtProperty *property, const QString &val);
  void regExpChanged(QtProperty *property, const QRegExp &regExp);
  void echoModeChanged(QtProperty *property, const int);
  void readOnlyChanged(QtProperty *property, bool);

protected:
  QString valueText(const QtProperty *property) const;
  QString displayText(const QtProperty *property) const;
  virtual void initializeProperty(QtProperty *property);
  virtual void uninitializeProperty(QtProperty *property);

private:
  QtStringPropertyManagerPrivate *d_ptr;
  Q_DECLARE_PRIVATE(QtStringPropertyManager)
  Q_DISABLE_COPY(QtStringPropertyManager)
};

class QtDatePropertyManagerPrivate;

class QT_QTPROPERTYBROWSER_EXPORT QtDatePropertyManager
    : public QtAbstractPropertyManager {
  Q_OBJECT
public:
  QtDatePropertyManager(QObject *parent = 0);
  ~QtDatePropertyManager();

  QDate value(const QtProperty *property) const;
  QDate minimum(const QtProperty *property) const;
  QDate maximum(const QtProperty *property) const;

public Q_SLOTS:
  void setValue(QtProperty *property, const QDate &val);
  void setMinimum(QtProperty *property, const QDate &minVal);
  void setMaximum(QtProperty *property, const QDate &maxVal);
  void setRange(QtProperty *property, const QDate &minVal, const QDate &maxVal);
Q_SIGNALS:
  void valueChanged(QtProperty *property, const QDate &val);
  void rangeChanged(QtProperty *property, const QDate &minVal,
                    const QDate &maxVal);

protected:
  QString valueText(const QtProperty *property) const;
  virtual void initializeProperty(QtProperty *property);
  virtual void uninitializeProperty(QtProperty *property);

private:
  QtDatePropertyManagerPrivate *d_ptr;
  Q_DECLARE_PRIVATE(QtDatePropertyManager)
  Q_DISABLE_COPY(QtDatePropertyManager)
};

class QtTimePropertyManagerPrivate;

class QT_QTPROPERTYBROWSER_EXPORT QtTimePropertyManager
    : public QtAbstractPropertyManager {
  Q_OBJECT
public:
  QtTimePropertyManager(QObject *parent = 0);
  ~QtTimePropertyManager();

  QTime value(const QtProperty *property) const;

public Q_SLOTS:
  void setValue(QtProperty *property, const QTime &val);
Q_SIGNALS:
  void valueChanged(QtProperty *property, const QTime &val);

protected:
  QString valueText(const QtProperty *property) const;
  virtual void initializeProperty(QtProperty *property);
  virtual void uninitializeProperty(QtProperty *property);

private:
  QtTimePropertyManagerPrivate *d_ptr;
  Q_DECLARE_PRIVATE(QtTimePropertyManager)
  Q_DISABLE_COPY(QtTimePropertyManager)
};

class QtDateTimePropertyManagerPrivate;

class QT_QTPROPERTYBROWSER_EXPORT QtDateTimePropertyManager
    : public QtAbstractPropertyManager {
  Q_OBJECT
public:
  QtDateTimePropertyManager(QObject *parent = 0);
  ~QtDateTimePropertyManager();

  QDateTime value(const QtProperty *property) const;

public Q_SLOTS:
  void setValue(QtProperty *property, const QDateTime &val);
Q_SIGNALS:
  void valueChanged(QtProperty *property, const QDateTime &val);

protected:
  QString valueText(const QtProperty *property) const;
  virtual void initializeProperty(QtProperty *property);
  virtual void uninitializeProperty(QtProperty *property);

private:
  QtDateTimePropertyManagerPrivate *d_ptr;
  Q_DECLARE_PRIVATE(QtDateTimePropertyManager)
  Q_DISABLE_COPY(QtDateTimePropertyManager)
};

class QtKeySequencePropertyManagerPrivate;

class QT_QTPROPERTYBROWSER_EXPORT QtKeySequencePropertyManager
    : public QtAbstractPropertyManager {
  Q_OBJECT
public:
  QtKeySequencePropertyManager(QObject *parent = 0);
  ~QtKeySequencePropertyManager();

  QKeySequence value(const QtProperty *property) const;

public Q_SLOTS:
  void setValue(QtProperty *property, const QKeySequence &val);
Q_SIGNALS:
  void valueChanged(QtProperty *property, const QKeySequence &val);

protected:
  QString valueText(const QtProperty *property) const;
  virtual void initializeProperty(QtProperty *property);
  virtual void uninitializeProperty(QtProperty *property);

private:
  QtKeySequencePropertyManagerPrivate *d_ptr;
  Q_DECLARE_PRIVATE(QtKeySequencePropertyManager)
  Q_DISABLE_COPY(QtKeySequencePropertyManager)
};

class QtCharPropertyManagerPrivate;

class QT_QTPROPERTYBROWSER_EXPORT QtCharPropertyManager
    : public QtAbstractPropertyManager {
  Q_OBJECT
public:
  QtCharPropertyManager(QObject *parent = 0);
  ~QtCharPropertyManager();

  QChar value(const QtProperty *property) const;

public Q_SLOTS:
  void setValue(QtProperty *property, const QChar &val);
Q_SIGNALS:
  void valueChanged(QtProperty *property, const QChar &val);

protected:
  QString valueText(const QtProperty *property) const;
  virtual void initializeProperty(QtProperty *property);
  virtual void uninitializeProperty(QtProperty *property);

private:
  QtCharPropertyManagerPrivate *d_ptr;
  Q_DECLARE_PRIVATE(QtCharPropertyManager)
  Q_DISABLE_COPY(QtCharPropertyManager)
};

class QtEnumPropertyManager;
class QtLocalePropertyManagerPrivate;

class QT_QTPROPERTYBROWSER_EXPORT QtLocalePropertyManager
    : public QtAbstractPropertyManager {
  Q_OBJECT
public:
  QtLocalePropertyManager(QObject *parent = 0);
  ~QtLocalePropertyManager();

  QtEnumPropertyManager *subEnumPropertyManager() const;

  QLocale value(const QtProperty *property) const;

public Q_SLOTS:
  void setValue(QtProperty *property, const QLocale &val);
Q_SIGNALS:
  void valueChanged(QtProperty *property, const QLocale &val);

protected:
  QString valueText(const QtProperty *property) const;
  virtual void initializeProperty(QtProperty *property);
  virtual void uninitializeProperty(QtProperty *property);

private:
  QtLocalePropertyManagerPrivate *d_ptr;
  Q_DECLARE_PRIVATE(QtLocalePropertyManager)
  Q_DISABLE_COPY(QtLocalePropertyManager)
  Q_PRIVATE_SLOT(d_func(), void slotEnumChanged(QtProperty *, int))
  Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *))
};

class QtPointPropertyManagerPrivate;

class QT_QTPROPERTYBROWSER_EXPORT QtPointPropertyManager
    : public QtAbstractPropertyManager {
  Q_OBJECT
public:
  QtPointPropertyManager(QObject *parent = 0);
  ~QtPointPropertyManager();

  QtIntPropertyManager *subIntPropertyManager() const;

  QPoint value(const QtProperty *property) const;

public Q_SLOTS:
  void setValue(QtProperty *property, const QPoint &val);
Q_SIGNALS:
  void valueChanged(QtProperty *property, const QPoint &val);

protected:
  QString valueText(const QtProperty *property) const;
  virtual void initializeProperty(QtProperty *property);
  virtual void uninitializeProperty(QtProperty *property);

private:
  QtPointPropertyManagerPrivate *d_ptr;
  Q_DECLARE_PRIVATE(QtPointPropertyManager)
  Q_DISABLE_COPY(QtPointPropertyManager)
  Q_PRIVATE_SLOT(d_func(), void slotIntChanged(QtProperty *, int))
  Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *))
};

class QtPointFPropertyManagerPrivate;

class QT_QTPROPERTYBROWSER_EXPORT QtPointFPropertyManager
    : public QtAbstractPropertyManager {
  Q_OBJECT
public:
  QtPointFPropertyManager(QObject *parent = 0);
  ~QtPointFPropertyManager();

  QtDoublePropertyManager *subDoublePropertyManager() const;

  QPointF value(const QtProperty *property) const;
  int decimals(const QtProperty *property) const;

public Q_SLOTS:
  void setValue(QtProperty *property, const QPointF &val);
  void setDecimals(QtProperty *property, int prec);
Q_SIGNALS:
  void valueChanged(QtProperty *property, const QPointF &val);
  void decimalsChanged(QtProperty *property, int prec);

protected:
  QString valueText(const QtProperty *property) const;
  virtual void initializeProperty(QtProperty *property);
  virtual void uninitializeProperty(QtProperty *property);

private:
  QtPointFPropertyManagerPrivate *d_ptr;
  Q_DECLARE_PRIVATE(QtPointFPropertyManager)
  Q_DISABLE_COPY(QtPointFPropertyManager)
  Q_PRIVATE_SLOT(d_func(), void slotDoubleChanged(QtProperty *, double))
  Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *))
};

class QtSizePropertyManagerPrivate;

class QT_QTPROPERTYBROWSER_EXPORT QtSizePropertyManager
    : public QtAbstractPropertyManager {
  Q_OBJECT
public:
  QtSizePropertyManager(QObject *parent = 0);
  ~QtSizePropertyManager();

  QtIntPropertyManager *subIntPropertyManager() const;

  QSize value(const QtProperty *property) const;
  QSize minimum(const QtProperty *property) const;
  QSize maximum(const QtProperty *property) const;

public Q_SLOTS:
  void setValue(QtProperty *property, const QSize &val);
  void setMinimum(QtProperty *property, const QSize &minVal);
  void setMaximum(QtProperty *property, const QSize &maxVal);
  void setRange(QtProperty *property, const QSize &minVal, const QSize &maxVal);
Q_SIGNALS:
  void valueChanged(QtProperty *property, const QSize &val);
  void rangeChanged(QtProperty *property, const QSize &minVal,
                    const QSize &maxVal);

protected:
  QString valueText(const QtProperty *property) const;
  virtual void initializeProperty(QtProperty *property);
  virtual void uninitializeProperty(QtProperty *property);

private:
  QtSizePropertyManagerPrivate *d_ptr;
  Q_DECLARE_PRIVATE(QtSizePropertyManager)
  Q_DISABLE_COPY(QtSizePropertyManager)
  Q_PRIVATE_SLOT(d_func(), void slotIntChanged(QtProperty *, int))
  Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *))
};

class QtSizeFPropertyManagerPrivate;

class QT_QTPROPERTYBROWSER_EXPORT QtSizeFPropertyManager
    : public QtAbstractPropertyManager {
  Q_OBJECT
public:
  QtSizeFPropertyManager(QObject *parent = 0);
  ~QtSizeFPropertyManager();

  QtDoublePropertyManager *subDoublePropertyManager() const;

  QSizeF value(const QtProperty *property) const;
  QSizeF minimum(const QtProperty *property) const;
  QSizeF maximum(const QtProperty *property) const;
  int decimals(const QtProperty *property) const;

public Q_SLOTS:
  void setValue(QtProperty *property, const QSizeF &val);
  void setMinimum(QtProperty *property, const QSizeF &minVal);
  void setMaximum(QtProperty *property, const QSizeF &maxVal);
  void setRange(QtProperty *property, const QSizeF &minVal,
                const QSizeF &maxVal);
  void setDecimals(QtProperty *property, int prec);
Q_SIGNALS:
  void valueChanged(QtProperty *property, const QSizeF &val);
  void rangeChanged(QtProperty *property, const QSizeF &minVal,
                    const QSizeF &maxVal);
  void decimalsChanged(QtProperty *property, int prec);

protected:
  QString valueText(const QtProperty *property) const;
  virtual void initializeProperty(QtProperty *property);
  virtual void uninitializeProperty(QtProperty *property);

private:
  QtSizeFPropertyManagerPrivate *d_ptr;
  Q_DECLARE_PRIVATE(QtSizeFPropertyManager)
  Q_DISABLE_COPY(QtSizeFPropertyManager)
  Q_PRIVATE_SLOT(d_func(), void slotDoubleChanged(QtProperty *, double))
  Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *))
};

class QtRectPropertyManagerPrivate;

class QT_QTPROPERTYBROWSER_EXPORT QtRectPropertyManager
    : public QtAbstractPropertyManager {
  Q_OBJECT
public:
  QtRectPropertyManager(QObject *parent = 0);
  ~QtRectPropertyManager();

  QtIntPropertyManager *subIntPropertyManager() const;

  QRect value(const QtProperty *property) const;
  QRect constraint(const QtProperty *property) const;

public Q_SLOTS:
  void setValue(QtProperty *property, const QRect &val);
  void setConstraint(QtProperty *property, const QRect &constraint);
Q_SIGNALS:
  void valueChanged(QtProperty *property, const QRect &val);
  void constraintChanged(QtProperty *property, const QRect &constraint);

protected:
  QString valueText(const QtProperty *property) const;
  virtual void initializeProperty(QtProperty *property);
  virtual void uninitializeProperty(QtProperty *property);

private:
  QtRectPropertyManagerPrivate *d_ptr;
  Q_DECLARE_PRIVATE(QtRectPropertyManager)
  Q_DISABLE_COPY(QtRectPropertyManager)
  Q_PRIVATE_SLOT(d_func(), void slotIntChanged(QtProperty *, int))
  Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *))
};

class QtRectFPropertyManagerPrivate;

class QT_QTPROPERTYBROWSER_EXPORT QtRectFPropertyManager
    : public QtAbstractPropertyManager {
  Q_OBJECT
public:
  QtRectFPropertyManager(QObject *parent = 0);
  ~QtRectFPropertyManager();

  QtDoublePropertyManager *subDoublePropertyManager() const;

  QRectF value(const QtProperty *property) const;
  QRectF constraint(const QtProperty *property) const;
  int decimals(const QtProperty *property) const;

public Q_SLOTS:
  void setValue(QtProperty *property, const QRectF &val);
  void setConstraint(QtProperty *property, const QRectF &constraint);
  void setDecimals(QtProperty *property, int prec);
Q_SIGNALS:
  void valueChanged(QtProperty *property, const QRectF &val);
  void constraintChanged(QtProperty *property, const QRectF &constraint);
  void decimalsChanged(QtProperty *property, int prec);

protected:
  QString valueText(const QtProperty *property) const;
  virtual void initializeProperty(QtProperty *property);
  virtual void uninitializeProperty(QtProperty *property);

private:
  QtRectFPropertyManagerPrivate *d_ptr;
  Q_DECLARE_PRIVATE(QtRectFPropertyManager)
  Q_DISABLE_COPY(QtRectFPropertyManager)
  Q_PRIVATE_SLOT(d_func(), void slotDoubleChanged(QtProperty *, double))
  Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *))
};

class QtEnumPropertyManagerPrivate;

class QT_QTPROPERTYBROWSER_EXPORT QtEnumPropertyManager
    : public QtAbstractPropertyManager {
  Q_OBJECT
public:
  QtEnumPropertyManager(QObject *parent = 0);
  ~QtEnumPropertyManager();

  int value(const QtProperty *property) const;
  QStringList enumNames(const QtProperty *property) const;
  QMap<int, QIcon> enumIcons(const QtProperty *property) const;

public Q_SLOTS:
  void setValue(QtProperty *property, int val);
  void setEnumNames(QtProperty *property, const QStringList &names);
  void setEnumIcons(QtProperty *property, const QMap<int, QIcon> &icons);
Q_SIGNALS:
  void valueChanged(QtProperty *property, int val);
  void enumNamesChanged(QtProperty *property, const QStringList &names);
  void enumIconsChanged(QtProperty *property, const QMap<int, QIcon> &icons);

protected:
  QString valueText(const QtProperty *property) const;
  QIcon valueIcon(const QtProperty *property) const;
  virtual void initializeProperty(QtProperty *property);
  virtual void uninitializeProperty(QtProperty *property);

private:
  QtEnumPropertyManagerPrivate *d_ptr;
  Q_DECLARE_PRIVATE(QtEnumPropertyManager)
  Q_DISABLE_COPY(QtEnumPropertyManager)
};

class QtFlagPropertyManagerPrivate;

class QT_QTPROPERTYBROWSER_EXPORT QtFlagPropertyManager
    : public QtAbstractPropertyManager {
  Q_OBJECT
public:
  QtFlagPropertyManager(QObject *parent = 0);
  ~QtFlagPropertyManager();

  QtBoolPropertyManager *subBoolPropertyManager() const;

  int value(const QtProperty *property) const;
  QStringList flagNames(const QtProperty *property) const;

public Q_SLOTS:
  void setValue(QtProperty *property, int val);
  void setFlagNames(QtProperty *property, const QStringList &names);
Q_SIGNALS:
  void valueChanged(QtProperty *property, int val);
  void flagNamesChanged(QtProperty *property, const QStringList &names);

protected:
  QString valueText(const QtProperty *property) const;
  virtual void initializeProperty(QtProperty *property);
  virtual void uninitializeProperty(QtProperty *property);

private:
  QtFlagPropertyManagerPrivate *d_ptr;
  Q_DECLARE_PRIVATE(QtFlagPropertyManager)
  Q_DISABLE_COPY(QtFlagPropertyManager)
  Q_PRIVATE_SLOT(d_func(), void slotBoolChanged(QtProperty *, bool))
  Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *))
};

class QtSizePolicyPropertyManagerPrivate;

class QT_QTPROPERTYBROWSER_EXPORT QtSizePolicyPropertyManager
    : public QtAbstractPropertyManager {
  Q_OBJECT
public:
  QtSizePolicyPropertyManager(QObject *parent = 0);
  ~QtSizePolicyPropertyManager();

  QtIntPropertyManager *subIntPropertyManager() const;
  QtEnumPropertyManager *subEnumPropertyManager() const;

  QSizePolicy value(const QtProperty *property) const;

public Q_SLOTS:
  void setValue(QtProperty *property, const QSizePolicy &val);
Q_SIGNALS:
  void valueChanged(QtProperty *property, const QSizePolicy &val);

protected:
  QString valueText(const QtProperty *property) const;
  virtual void initializeProperty(QtProperty *property);
  virtual void uninitializeProperty(QtProperty *property);

private:
  QtSizePolicyPropertyManagerPrivate *d_ptr;
  Q_DECLARE_PRIVATE(QtSizePolicyPropertyManager)
  Q_DISABLE_COPY(QtSizePolicyPropertyManager)
  Q_PRIVATE_SLOT(d_func(), void slotIntChanged(QtProperty *, int))
  Q_PRIVATE_SLOT(d_func(), void slotEnumChanged(QtProperty *, int))
  Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *))
};

class QtFontPropertyManagerPrivate;

class QT_QTPROPERTYBROWSER_EXPORT QtFontPropertyManager
    : public QtAbstractPropertyManager {
  Q_OBJECT
public:
  QtFontPropertyManager(QObject *parent = 0);
  ~QtFontPropertyManager();

  QtIntPropertyManager *subIntPropertyManager() const;
  QtEnumPropertyManager *subEnumPropertyManager() const;
  QtBoolPropertyManager *subBoolPropertyManager() const;

  QFont value(const QtProperty *property) const;

public Q_SLOTS:
  void setValue(QtProperty *property, const QFont &val);
Q_SIGNALS:
  void valueChanged(QtProperty *property, const QFont &val);

protected:
  QString valueText(const QtProperty *property) const;
  QIcon valueIcon(const QtProperty *property) const;
  virtual void initializeProperty(QtProperty *property);
  virtual void uninitializeProperty(QtProperty *property);

private:
  QtFontPropertyManagerPrivate *d_ptr;
  Q_DECLARE_PRIVATE(QtFontPropertyManager)
  Q_DISABLE_COPY(QtFontPropertyManager)
  Q_PRIVATE_SLOT(d_func(), void slotIntChanged(QtProperty *, int))
  Q_PRIVATE_SLOT(d_func(), void slotEnumChanged(QtProperty *, int))
  Q_PRIVATE_SLOT(d_func(), void slotBoolChanged(QtProperty *, bool))
  Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *))
  Q_PRIVATE_SLOT(d_func(), void slotFontDatabaseChanged())
  Q_PRIVATE_SLOT(d_func(), void slotFontDatabaseDelayedChange())
};

class QtColorPropertyManagerPrivate;

class QT_QTPROPERTYBROWSER_EXPORT QtColorPropertyManager
    : public QtAbstractPropertyManager {
  Q_OBJECT
public:
  QtColorPropertyManager(QObject *parent = 0);
  ~QtColorPropertyManager();

  QtIntPropertyManager *subIntPropertyManager() const;

  QColor value(const QtProperty *property) const;

public Q_SLOTS:
  void setValue(QtProperty *property, const QColor &val);
Q_SIGNALS:
  void valueChanged(QtProperty *property, const QColor &val);

protected:
  QString valueText(const QtProperty *property) const;
  QIcon valueIcon(const QtProperty *property) const;
  virtual void initializeProperty(QtProperty *property);
  virtual void uninitializeProperty(QtProperty *property);

private:
  QtColorPropertyManagerPrivate *d_ptr;
  Q_DECLARE_PRIVATE(QtColorPropertyManager)
  Q_DISABLE_COPY(QtColorPropertyManager)
  Q_PRIVATE_SLOT(d_func(), void slotIntChanged(QtProperty *, int))
  Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *))
};

class QtCursorPropertyManagerPrivate;

class QT_QTPROPERTYBROWSER_EXPORT QtCursorPropertyManager
    : public QtAbstractPropertyManager {
  Q_OBJECT
public:
  QtCursorPropertyManager(QObject *parent = 0);
  ~QtCursorPropertyManager();

#ifndef QT_NO_CURSOR
  QCursor value(const QtProperty *property) const;
#endif

public Q_SLOTS:
  void setValue(QtProperty *property, const QCursor &val);
Q_SIGNALS:
  void valueChanged(QtProperty *property, const QCursor &val);

protected:
  QString valueText(const QtProperty *property) const;
  QIcon valueIcon(const QtProperty *property) const;
  virtual void initializeProperty(QtProperty *property);
  virtual void uninitializeProperty(QtProperty *property);

private:
  QtCursorPropertyManagerPrivate *d_ptr;
  Q_DECLARE_PRIVATE(QtCursorPropertyManager)
  Q_DISABLE_COPY(QtCursorPropertyManager)
};

class QT_QTPROPERTYBROWSER_EXPORT QtPushButtonPropertyManager
    : public QtAbstractPropertyManager {
  Q_OBJECT
public:
  QtPushButtonPropertyManager(QObject *parent = 0)
      : QtAbstractPropertyManager(parent) {}

  int value(const QtProperty *property) const;
  QString label(const QtProperty *property) const;

public slots:
  void setValue(QtProperty *property, const int &val);
  void setLabel(QtProperty *property, const QString &label);

signals:
  void valueChanged(QtProperty *property, const int &val);
  void labelChanged(QtProperty *property, const QString &val);

protected:
  virtual QString valueText(const QtProperty *property) const {
    return label(property);
  }
  virtual void initializeProperty(QtProperty *property) {
    theValues[property] = Data();
  }
  virtual void uninitializeProperty(QtProperty *property) {
    theValues.remove(property);
  }

private:
  struct Data {
    int value;
    QString label;
  };

  QMap<const QtProperty *, Data> theValues;
};

#if QT_VERSION >= 0x040400
QT_END_NAMESPACE
#endif

#endif
